#include "timer.h"

#include <sys/epoll.h>
#include <stdio.h>
#include <time.h>

static uint32_t now()
{
    struct timespec spec;
    clock_gettime(CLOCK_MONOTONIC, &spec);
    uint32_t now = spec.tv_sec * 1000;
    now += spec.tv_nsec / 1000000;
    return now;
}

void func(void* e)
{
    timer_entry_t* te = (timer_entry_t*)e;
    printf("hello-timer-callback min heap time = %u\n", te->expired);
}

int main()
{
    int epfd = epoll_create(1);

    init_timer();

    // 1000ms 后执行 false表示不每1000ms执行
    add_timer(1000, func, false);
    add_timer(1000, func, false);

    add_timer(3000, func, false);

    timer_entry_t* e = add_timer(4000, func, false);
    del_timer(e);

    // 5000ms 后执行 true表示每5000ms执行
    add_timer(5000, func, true);

    struct epoll_event ev[64] = {0};

    printf("now = %u\n", now());
    while (true)
    {
        /*
            阻塞等待多久 timeout参数
            -1: 永久阻塞
            0:  立即返回, 没有事件,立即返回,有事件就拷贝到 ev 数组当中
            t > 0: 阻塞等待 t 毫秒, t毫秒都没有事件返回0
            timeout 最近触发的定时任务离当前的时间
        */
        int n = epoll_wait(epfd, ev, sizeof(ev), time_to_sleep());
        for (int i = 0; i < n; i++)
        {
            // ... 处理网络事件
        }

        /* 处理定时事件 */
        check_timer();
    }

    des_timer();

    return 0;
}